Micron Document
██████╗ ███████╗████████╗██╗██████╗ ███████╗██████╗ ██╗ █████╗
██╔══██╗██╔════╝╚══██╔══╝██║██╔══██╗██╔════╝██╔══██╗██║██╔══██╗
██████╔╝█████╗ ██║ ██║██████╔╝█████╗ ██║ ██║██║███████║
██╔══██╗██╔══╝ ██║ ██║██╔═══╝ ██╔══╝ ██║ ██║██║██╔══██║
██║ ██║███████╗ ██║ ██║██║ ███████╗██████╔╝██║██║ ██║
╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝╚═╝ ╚══════╝╚═════╝ ╚═╝╚═╝ ╚═╝


🬧 The NomadNet Encyclopedia | Archives | Info
- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b

🔍 Search

¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Shabang
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
top
Uno mwawshabang (chiamato anche mwbashebang, mwbqhashbang, mwbghashpling, o mwbwpound bang), nei mwcasistemi operativi mwcqUnix e mwcgUnix-like, è una sequenza di caratteri che inizia per "mwcw#!" collocata esattamente all'inizio di uno mwdamwdqscript, la quale indica al sistema quale interprete utilizzare per eseguire lo mwdgscript stesso.

Il termine deriverebbe da una contrazione di mwfaSHArp bang o mwfqhaSH bang, che rappresentano i nomi tradizionalmente usati in ambienti Unix per riferirsi ai due caratteri in questione. Un'altra teoria sul mwfgsh di mwfwshabang deriva dalla mwgashell testuale standard, "mwgq/bin/sh", che è solitamente l'interprete specificato.

Contents

Storia
Esempi
Note

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Storia

Lo mwhqshabang fu introdotto da mwhgDennis Ritchie tra la versione 7 di mwhwUnix e la versione 8 nei Bell Labs. Fu quindi aggiunta a mwiaBSD a Berkeley. Dato che la versione 8 e successive non furono distribuite al pubblico, la prima diffusione di massa dello mwiqshabang avvenne proprio su BSD.

Caratteristiche

Precisamente, consiste in un mwjamwjqmagic number (il carattere cancelletto e il punto esclamativo "mwjg#!"), seguito dal mwjwmwkapathname assoluto dell'interprete da utilizzare. Lo mwkqshabang viene utilizzato in modo che lo mwkgscript appaia e funzioni agli occhi dell'utente come un qualsiasi altro mwkwfile eseguibile nativo per la piattaforma.

Dato che nei linguaggi di scripting il carattere "mwlq#" indica comunemente l'inizio di una linea di commento, l'interprete ignorerà il contenuto della riga che contiene in incipit lo mwlgshabang; la linea esiste infatti soltanto per indicare quale interprete è necessario, e concettualmente non fa parte dello mwlwscript.

Portabilità

Mentre molti mwmgshabang indicano interpreti che hanno mwmwmwnapathname standard ben noti, è anche possibile che tra varianti di uno stesso sistema operativo lo stesso interprete vada indicato con mwnqpathname differenti. In assenza di una rigida standardizzazione delle posizioni di ciascun interprete, ci possono essere problemi dovuti al fatto che lo mwngshabang potrebbe richiedere un interprete che non esiste, o che non si trova nel posto indicato. Questo limita la portabilità del file.

Per questo motivo, nel passaggio da computer a computer, è spesso necessario modificare lo mwoascript proprio per permettere la portabilità tra sistemi diversi. Questa è una delle ragioni per cui lo standard mwoqPOSIX non prevede questa caratteristica, che è però comunemente utilizzata, soprattutto a livello didattico. Spesso il comando mwogenv può essere usato per aggirare il problema.

Un altro problema di portabilità è legato alla gestione di eventuali parametri specificati all'interprete, in quanto alcuni sistemi hanno possibilità limitate al riguardo. Ad esempio sui sistemi basati su mwpaLinux lo mwpqshabang

#!/usr/bin/env perl -w

verrà eseguito come mwqw/usr/bin/env "perl -w", con "perl" e "-w" uniti in un unico parametro a mwra/usr/bin/env e questo causa un errore:

/usr/bin/env: perl -w: No such file or directory

Altri sistemi possono comportarsi in modo ancora diverso.

Shabang come numero magico

Lo mwsqshabang è di fatto una versione leggibile di un mwsgmwswmagic number nel file eseguibile. La stringa magica diviene la sequenza di byte mwta0x23 mwtq0x21 all'inizio del file, che corrisponde appunto alla rappresentazione secondo la codifica mwtgASCII dei caratteri "mwtw#!".

I mwuqfile eseguibili che non richiedono interpreti hanno invece altri mwugmagic number.

Esempi

Script di shell

Esegue usando mwvgBash:

#!/bin/bash

Esegue usando la shell mwxa/bin/sh. Su molti dei sistemi mwxqUnix e mwxgUnix-like questa è una shell mwxwPOSIX (ad esempio su mwyaHP-UX, mwyqAIX ed anche su mwygGNU/Linux, dove mwywBash si comporta come una shell POSIX se invocata con questo nome), mentre su mwzaSolaris è invece una mwzqBourne shell:

#!/bin/sh

Esegue usando mwawKorn shell:

#!/bin/ksh

Esegue usando csh, la mwcqC shell:

#!/bin/csh

Script Perl

Esegue usando mweaPerl:

#!/usr/bin/perl

Esegue usando mwfgPerl, ma si assume che l'interprete Perl sia in un'altra directory:

#!/usr/local/bin/perl

Script Python

Esegue usando mwhqPython:

#!/usr/bin/python

Esegue usando mwiwPython versione 3:

#!/usr/bin/env python3

Script Ruby

Esegue usando mwkgRuby:

#!/usr/bin/ruby

Script Tcl

Esegue uno script mwmqTcl invocando l'interprete attraverso mwmg/bin/sh:

#!/bin/sh
# Questa linea e la seguente sono ignorate da tclsh, mentre la shell ignora solo questa linea \
exec tclsh "$0" "$@"

Questo metodo sfrutta una particolarità del linguaggio Tcl: se una linea di commento termina con una barra inversa ("mwqw\"), allora il commento prosegue anche sulla linea successiva, mentre ciò non è vero per la shell.

Di fatto lo script viene avviato una prima volta tramite mwrq/bin/sh, che ignora la linea di commento e procede ad eseguire il comando "mwrgexec tclsh "$0" "$@"", che ricerca mwrwtclsh nelle directory elencate nella mwsavariabile d'ambiente mwsq$PATH e lo invoca passandogli il mwsgpathname dello mwswscript e tutti i parametri specificati, sostituendolo al processo della shell. L'interprete Tcl a questo punto inizia a leggere lo script, considera come un commento tutte e tre le linee, e procede quindi ad esaminare le linee successive.

Altri script

Esegue usando l'interprete mwtgAwk presente nella directory mwtw/bin/. Notare l'uso dell'opzione mwua-f, altrimenti lo script verrebbe considerato come file di testo di input da elaborare (invece che le istruzioni AWK da eseguire):

#!/bin/awk -f

Esegue usando mwvgLua:

#!/usr/bin/lua

Esegue usando l'interprete mwxaPHP:

#!/usr/bin/php

Invocazione con parametri e opzioni

In molti sistemi si può indicare di seguito all'interprete un parametro o una opzione, ed in alcuni di essi anche più parametri e/o opzioni. Tuttavia, implementazioni diverse hanno comportamenti e vincoli diversi: ad esempio in molti sistemi, tra cui quelli basati su mwywLinux, tutto ciò che segue l'interprete è passato come un unico parametro anche se contiene spazi, mentre su altri sistemi vi sono limitazioni sulla lunghezza complessiva dello mwzashabang.cite-ref-1[1]

Esegue usando l'interprete AWK, e ad esso viene passata anche l'opzione mw0g-f:

#!/bin/awk -f
# Il resto dello script AWK
...

Esegue usando l'interprete mw2qPerl, e ad esso viene passata anche l'opzione -w per ottenere i messaggi di warning:

#!/usr/bin/perl -w
#
# Il resto dello script Perl
...

Esegue usando mw4gbash, indicando con l'opzione mw4w-x di mostrare ogni comando subito prima di eseguirlo:

#!/bin/bash -x
#
# Il resto dello script Bash
...

Risoluzione di problemi legati allo shabang tramite env

L'invocazione tramite mw7qenv è utile in quanto diventa possibile specificare un interprete non conoscendo il suo mw7gpathname assoluto. mw7wenv infatti cerca l'interprete nelle directory specificate nella variabile d'ambiente mw8a$PATH.

Ad esempio, supponendo di non sapere con precisione dove è installato l'interprete Perl:

#!/usr/bin/env perl
#
# Il resto dello script Perl
...

Nonostante questo metodo aumenti di molto la portabilità, esso non è infallibile: mentre mw-qenv è quasi sempre disponibile in mw-g/usr/bin/env, in un numero ristretto di piattaforme si trova in mw-w/bin/env. In questo caso, come nel caso in cui si indichi un qualsiasi path non coerente con le impostazioni generali del sistema operativo, l'interprete dei comandi (il terminale) restituisce un errore e non esegue lo script.

Inoltre, sui sistemi che non separano tra di loro i parametri specificati di seguito all'interprete (che in questo caso è mw-q/usr/bin/env) diventa impossibile specificare parametri all'interprete vero e proprio.

Altri esempi

Questo è un mwaqamwaqequine, ovvero un file che produce in output sé stesso attraverso il comando mwaqicat:

#!/bin/cat
Testo qualsiasi, anche
su più righe.
...

Questo mwaquscript non fa altro che scrivere all'infinito il nome con cui è invocato:

#!/usr/bin/yes
Testo qualsiasi (/usr/bin/yes non legge file)
...

Questo mwaqgscript non fa altro che auto-cancellarsi, usando mwaqkrm come interprete:

#!/bin/rm
Testo qualsiasi (/bin/rm non legge il file, ma lo cancella e basta)
...

Note

cite-note-11. mware(mwarimwarmEN) Andries Brouwer, mwarqmwaruThe #! line, in mwary#! - the Unix truth as far as I know it. mwarcURL consultato il 24-05-2008.

Voci correlate

• mwarsBash
• mwar0Magic number
• mwar8Script
• mwasmUnix

Altri progetti

Altri progetti

• Wikimedia Commons

• Wikimedia Commons contiene immagini o altri file su Shabang

Collegamenti esterni

• mwasg(EN) Sven Mascheck, The '#!'-magic, details about the shebang mechanism on various Unix flavours, su in-ulm.de, 26-02-2008. URL consultato il 24-05-2008. (dettagli sul meccanismo mwaskshabang su varie piattaforme)
• mwass(EN) Andries Brouwer, #! - the Unix truth as far as I know it, su homepages.cwi.nl, 05-12-2002. URL consultato il 24-05-2008. (dettagli sul meccanismo mwaswshabang su varie piattaforme)
• mwas4(EN) shebang, su foldoc.org. URL consultato il 24-05-2008. (articolo del mwas8Free On-line Dictionary of Computing)